{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fc72d98f-8993-4bd4-a545-23d122f3df71",
   "metadata": {},
   "source": [
    "# H₂ Molecule Homework Assignment\n",
    "### Quantum Software Development Journey: From Theory to Application with Classiq - Part 3\n",
    "\n",
    "- Similarly to what we have done in class, in this exercise we will implement the VQE on H2 molecule.\n",
    "- This time instead of using the built-in methods and functions (such as `Molecule` and `MoleculeProblem`) to define and solve the problem, you will be provided with a two qubits Hamiltonian."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56eda6d8-76c4-4862-b914-0c4598d67274",
   "metadata": {},
   "source": [
    "## Submission\n",
    "- Submit the completed Jupyter notebook and report via GitHub. Ensure all files are correctly named and organized.\n",
    "- Use the Typeform link provided in the submission folder to confirm your submission.\n",
    "\n",
    "## Additional Resources\n",
    "- [Classiq Documentation](https://docs.classiq.io/latest/)\n",
    "- The notebook from live session #3\n",
    "\n",
    "## Important Dates\n",
    "- **Assignment Release:** 22.5.2024\n",
    "- **Submission Deadline:** 3.6.2024 (7 A.M GMT+3)\n",
    "\n",
    "---\n",
    "\n",
    "Happy coding and good luck!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d41e969d-f6a7-4ff7-9660-19ce6c97ba6b",
   "metadata": {},
   "source": [
    "### Part 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f710d6f4-d40b-42d5-b524-c6acb8059fe2",
   "metadata": {},
   "source": [
    "Given the following Hamiltonian:"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6ba8a6f1-3259-4492-a1ca-3abde7530cd4",
   "metadata": {},
   "source": [
    "$$\n",
    "\\hat{H} = -1.0523 \\cdot (I \\otimes I) + 0.3979 \\cdot (I \\otimes Z) - 0.3979 \\cdot (Z \\otimes I) - 0.0112 \\cdot (Z \\otimes Z) + 0.1809 \\cdot (X \\otimes X)\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "736d275c-9a5a-4c08-b891-3078430dc6c1",
   "metadata": {},
   "source": [
    "Complete the following code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "19266c11-6acc-4edb-910f-2d0dfe80a6c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing import List\n",
    "from classiq import *\n",
    "\n",
    "HAMILTONIAN = QConstant(\"HAMILTONIAN\", List[PauliTerm],\n",
    "                        [PauliTerm([Pauli.I, Pauli.I], -1.0523),\n",
    "                         PauliTerm([Pauli.I, Pauli.Z],  0.3979),\n",
    "                         PauliTerm([Pauli.Z, Pauli.I], -0.3979),\n",
    "                         PauliTerm([Pauli.Z, Pauli.Z], -0.0112),\n",
    "                         PauliTerm([Pauli.X, Pauli.X],  0.1809)]\n",
    "                        ) #TODO: Complete Hamiltonian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0bb68899-2076-45c0-8868-131f38aa3b78",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/490774a2-4a81-468f-b28c-680cd171ca48?version=0.42.0\n"
     ]
    }
   ],
   "source": [
    "@qfunc\n",
    "def main(q: Output[QArray[QBit]], angles: CArray[CReal, 3]) -> None:\n",
    "    # TODO: Create an ansatz which allows each qubit to have arbitrary rotation\n",
    "    allocate(2, q)\n",
    "    U(angles[0], angles[1], angles[2], 0, q[0])\n",
    "    U(angles[0], angles[1], angles[2], 0, q[1])\n",
    "\n",
    "\n",
    "@cfunc\n",
    "def cmain() -> None:\n",
    "    res = vqe(\n",
    "        # TODO: complete the missing argument\n",
    "        HAMILTONIAN,\n",
    "        False,\n",
    "        [],\n",
    "        optimizer=Optimizer.COBYLA,\n",
    "        max_iteration=1000,\n",
    "        tolerance=0.001,\n",
    "        step_size=0,\n",
    "        skip_compute_variance=False,\n",
    "        alpha_cvar=1.0,\n",
    "    )\n",
    "    save({\"result\": res})\n",
    "\n",
    "#TODO: complete the line, use classical_execution_function\n",
    "qmod = create_model(main, classical_execution_function=cmain)\n",
    "qprog = synthesize(qmod)\n",
    "show(qprog)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0563c1a8-7aec-4da9-9105-6b16c5c24382",
   "metadata": {},
   "outputs": [],
   "source": [
    "execution = execute(qprog)\n",
    "res = execution.result()\n",
    "execution.open_in_ide()\n",
    "vqe_result = res[0].value #TODO: complete the line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "de17cfc0-8e64-4493-b4c2-4a97fc9797a0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal energy: -1.07021669921875\n",
      "Optimal parameters: {'angles_0': -2.7719312634977746, 'angles_1': 4.446680549285845, 'angles_2': 3.477513433640137}\n",
      "Eigenstate: {'00': (0.05412658773652741+0j), '10': (0.18221724671391565+0j), '01': (0.19008632907181935+0j), '11': (0.9631896879639026+0j)}\n"
     ]
    }
   ],
   "source": [
    "print(f\"Optimal energy: {vqe_result.energy}\")\n",
    "print(f\"Optimal parameters: {vqe_result.optimal_parameters}\")\n",
    "print(f\"Eigenstate: {vqe_result.eigenstate}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5df11dfc-3e3a-4191-bd47-d522ca3dcbfa",
   "metadata": {},
   "source": [
    "Does it similar to the `optimal energy` we calculated in class? \\\n",
    "Does it similar to the `total energy` we calculated in class?"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f0e0bea-b12f-43ad-94e8-100fedf2b57f",
   "metadata": {},
   "source": [
    "### Part 2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66882248-de08-4a6e-b33c-647f015f7d79",
   "metadata": {},
   "source": [
    "**Now, we want to have a more interesting ansatz in our `main`.**  \n",
    "Add **one** line of code to the `main` function you created in Part 1 that creates **entanglement** between the two qubits.  \n",
    "Which gate should you use?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "bb39be9e-4994-44e5-84d8-c99bc8b77145",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/bc8784d2-6c13-4f36-840e-ca36485adca6?version=0.42.0\n"
     ]
    }
   ],
   "source": [
    "@qfunc\n",
    "def main(q: Output[QArray[QBit]], angles: CArray[CReal, 3]) -> None:\n",
    "    # TODO: Create an ansatz which allows each qubit to have arbitrary rotation\n",
    "    allocate(2, q)\n",
    "    U(angles[0], angles[1], angles[2], 0, q[0])\n",
    "    U(angles[0], angles[1], angles[2], 0, q[1])\n",
    "    \n",
    "    # create entanglement between the two qubits\n",
    "    CX(q[0], q[1])\n",
    "\n",
    "\n",
    "\n",
    "@cfunc\n",
    "def cmain() -> None:\n",
    "    res = vqe(\n",
    "        # TODO: complete the missing argument\n",
    "        HAMILTONIAN,\n",
    "        False,\n",
    "        [],\n",
    "        optimizer=Optimizer.COBYLA,\n",
    "        max_iteration=1000,\n",
    "        tolerance=0.001,\n",
    "        step_size=0,\n",
    "        skip_compute_variance=False,\n",
    "        alpha_cvar=1.0,\n",
    "    )\n",
    "    save({\"result\": res})\n",
    "\n",
    "#TODO: complete the line, use classical_execution_function\n",
    "qmod = create_model(main, classical_execution_function=cmain)\n",
    "qprog = synthesize(qmod)\n",
    "show(qprog)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "112a1590-283c-4f79-8035-72936561102d",
   "metadata": {},
   "outputs": [],
   "source": [
    "execution = execute(qprog)\n",
    "res = execution.result()\n",
    "execution.open_in_ide()\n",
    "vqe_result = res[0].value #TODO: complete the line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "06500e4c-a04b-4cfa-a84d-41f96a0c68eb",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal energy: -1.84520302734375\n",
      "Optimal parameters: {'angles_0': 3.2017515243271615, 'angles_1': -5.448452277177368, 'angles_2': -3.027587294714585}\n",
      "Eigenstate: {'11': (0.03125+0j), '10': (0.03125+0j), '01': (0.9990229601966113+0j)}\n"
     ]
    }
   ],
   "source": [
    "print(f\"Optimal energy: {vqe_result.energy}\")\n",
    "print(f\"Optimal parameters: {vqe_result.optimal_parameters}\")\n",
    "print(f\"Eigenstate: {vqe_result.eigenstate}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30a635d7-2f15-4c94-a94b-f4270f17aed8",
   "metadata": {},
   "source": [
    "Does it similar to the `optimal energy` we calculated in class? \\\n",
    "Does it similar to the `total energy` we calculated in class? \\\n",
    "What can we learn about the provided  form this result Hamiltonian?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "a7824e45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "energy=-1.84520302734375 time=0.4464535713195801 solution=None eigenstate={'11': (0.03125+0j), '10': (0.03125+0j), '01': (0.9990229601966113+0j)} reduced_probabilities={'11': 0.0009765625, '10': 0.0009765625, '01': 0.998046875} optimized_circuit_sample_results=ExecutionDetails(vendor_format_result={}, counts={'11': 2, '10': 2, '01': 2044}, counts_lsb_right=True, parsed_states={'11': {'q': 3.0}, '10': {'q': 2.0}, '01': {'q': 1.0}}, histogram=None, output_qubits_map={'q': (0, 1)}, state_vector=None, parsed_state_vector_states=None, physical_qubits_map={'q': (0, 1)}, num_shots=2048) intermediate_results=[VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 758414, tzinfo=datetime.timezone.utc), iteration_number=1, parameters=[2.591176246955154, -5.62624493452543, -3.026748767095255], mean_all_solutions=-1.6016041015625, solutions=[], standard_deviation=0.378010120085899), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 773212, tzinfo=datetime.timezone.utc), iteration_number=2, parameters=[3.591176246955154, -5.62624493452543, -3.026748767095255], mean_all_solutions=-1.7835126953124998, solutions=[], standard_deviation=0.3353871483673314), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 792071, tzinfo=datetime.timezone.utc), iteration_number=3, parameters=[3.591176246955154, -4.62624493452543, -3.026748767095255], mean_all_solutions=-1.7193850585937498, solutions=[], standard_deviation=0.34049937265490965), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 805220, tzinfo=datetime.timezone.utc), iteration_number=4, parameters=[3.591176246955154, -5.62624493452543, -2.026748767095255], mean_all_solutions=-1.7835126953124998, solutions=[], standard_deviation=0.3353871483673314), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 818623, tzinfo=datetime.timezone.utc), iteration_number=5, parameters=[4.534289197595433, -5.958717433139357, -3.026748767095255], mean_all_solutions=-1.3073765625, solutions=[], standard_deviation=0.5615424423558852), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 832066, tzinfo=datetime.timezone.utc), iteration_number=6, parameters=[4.062732722275293, -5.792481183832393, -3.026748767095255], mean_all_solutions=-1.55428916015625, solutions=[], standard_deviation=0.5056342397245829), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 844981, tzinfo=datetime.timezone.utc), iteration_number=7, parameters=[3.3431392774380595, -5.6575125176232, -3.026748767095255], mean_all_solutions=-1.83837626953125, solutions=[], standard_deviation=0.22633583253549727), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 857573, tzinfo=datetime.timezone.utc), iteration_number=8, parameters=[3.2268152262568046, -5.436223758042464, -3.026748767095255], mean_all_solutions=-1.8445676757812501, solutions=[], standard_deviation=0.18729033409038648), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 875596, tzinfo=datetime.timezone.utc), iteration_number=9, parameters=[3.2268152262568046, -5.436223758042464, -2.901748767095255], mean_all_solutions=-1.8445676757812501, solutions=[], standard_deviation=0.18729033409038648), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 891550, tzinfo=datetime.timezone.utc), iteration_number=10, parameters=[2.9941314913478547, -5.527647384686902, -3.026748767095255], mean_all_solutions=-1.8108190429687498, solutions=[], standard_deviation=0.1971209656563929), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 904967, tzinfo=datetime.timezone.utc), iteration_number=11, parameters=[3.325497578895095, -5.359498317165451, -3.026748767095255], mean_all_solutions=-1.8361275390624998, solutions=[], standard_deviation=0.21893409874005848), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 918301, tzinfo=datetime.timezone.utc), iteration_number=12, parameters=[3.2603126158808133, -5.488989039131239, -3.026748767095255], mean_all_solutions=-1.84418837890625, solutions=[], standard_deviation=0.19660479594710784), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 938686, tzinfo=datetime.timezone.utc), iteration_number=13, parameters=[3.171296302671158, -5.464927401084613, -3.026748767095255], mean_all_solutions=-1.84237646484375, solutions=[], standard_deviation=0.18081708529012178), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 955445, tzinfo=datetime.timezone.utc), iteration_number=14, parameters=[3.2500212740031085, -5.415294308742584, -3.026748767095255], mean_all_solutions=-1.8430465820312498, solutions=[], standard_deviation=0.19441739923500487), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 968573, tzinfo=datetime.timezone.utc), iteration_number=15, parameters=[3.2268152262568046, -5.436223758042464, -3.011123767095255], mean_all_solutions=-1.8445676757812501, solutions=[], standard_deviation=0.18729033409038648), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 984559, tzinfo=datetime.timezone.utc), iteration_number=16, parameters=[3.1986195961055737, -5.449698510002148, -3.026748767095255], mean_all_solutions=-1.84484970703125, solutions=[], standard_deviation=0.18072523940533955), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 22, 997082, tzinfo=datetime.timezone.utc), iteration_number=17, parameters=[3.2102642410300346, -5.478697902143764, -3.026748767095255], mean_all_solutions=-1.84435537109375, solutions=[], standard_deviation=0.18406340596878584), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 12864, tzinfo=datetime.timezone.utc), iteration_number=18, parameters=[3.1732342784852783, -5.4314735779222545, -3.026748767095255], mean_all_solutions=-1.84237646484375, solutions=[], standard_deviation=0.18081708529012178), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 25677, tzinfo=datetime.timezone.utc), iteration_number=19, parameters=[3.185926937295426, -5.440586043962201, -3.026748767095255], mean_all_solutions=-1.843259765625, solutions=[], standard_deviation=0.18078817268061279), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 38419, tzinfo=datetime.timezone.utc), iteration_number=20, parameters=[3.1986195961055737, -5.449698510002148, -3.018936267095255], mean_all_solutions=-1.84484970703125, solutions=[], standard_deviation=0.18072523940533955), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 54146, tzinfo=datetime.timezone.utc), iteration_number=21, parameters=[3.2042902102445594, -5.4642582064374015, -3.026748767095255], mean_all_solutions=-1.8441787109375, solutions=[], standard_deviation=0.18407196828067413), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 66667, tzinfo=datetime.timezone.utc), iteration_number=22, parameters=[3.2053213272750813, -5.445683294493405, -3.026748767095255], mean_all_solutions=-1.8441787109375, solutions=[], standard_deviation=0.18407196828067413), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 82224, tzinfo=datetime.timezone.utc), iteration_number=23, parameters=[3.194719350789295, -5.449482002414873, -3.026748767095255], mean_all_solutions=-1.84414306640625, solutions=[], standard_deviation=0.18075493904464865), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 95474, tzinfo=datetime.timezone.utc), iteration_number=24, parameters=[3.199962592591955, -5.453366636158657, -3.026748767095255], mean_all_solutions=-1.84484970703125, solutions=[], standard_deviation=0.18072523940533955), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 108114, tzinfo=datetime.timezone.utc), iteration_number=25, parameters=[3.2004536591838284, -5.449027011758957, -3.026748767095255], mean_all_solutions=-1.8450263671875, solutions=[], standard_deviation=0.18071738199833995), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 123912, tzinfo=datetime.timezone.utc), iteration_number=26, parameters=[3.202287722262083, -5.448355513515767, -3.026748767095255], mean_all_solutions=-1.8453796875, solutions=[], standard_deviation=0.18070114803150075), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 137062, tzinfo=datetime.timezone.utc), iteration_number=27, parameters=[3.204215762026098, -5.448150392901527, -3.026513638475947], mean_all_solutions=-1.8441787109375, solutions=[], standard_deviation=0.18407196828067413), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 149810, tzinfo=datetime.timezone.utc), iteration_number=28, parameters=[3.2024117660313935, -5.448413069051517, -3.027715708055193], mean_all_solutions=-1.8446025390625, solutions=[], standard_deviation=0.18240355711064926), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 162686, tzinfo=datetime.timezone.utc), iteration_number=29, parameters=[3.200964098765243, -5.447555772709687, -3.02555581581908], mean_all_solutions=-1.8450263671875, solutions=[], standard_deviation=0.18071738199833995), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 178398, tzinfo=datetime.timezone.utc), iteration_number=30, parameters=[3.201957976817865, -5.45017117313695, -3.0261089660733367], mean_all_solutions=-1.84520302734375, solutions=[], standard_deviation=0.1807093515480838), VQEIntermediateData(utc_time=datetime.datetime(2024, 6, 2, 16, 17, 23, 191348, tzinfo=datetime.timezone.utc), iteration_number=31, parameters=[3.2017515243271615, -5.448452277177368, -3.027587294714585], mean_all_solutions=-1.84520302734375, solutions=[], standard_deviation=0.1807093515480838)] optimal_parameters={'angles_0': 3.2017515243271615, 'angles_1': -5.448452277177368, 'angles_2': -3.027587294714585} convergence_graph_str='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' num_solutions=None num_shots=2048\n"
     ]
    }
   ],
   "source": [
    "print(res[0].value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "d3fd78b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Difference in Optimal energy: 0.02051206583780174\n"
     ]
    }
   ],
   "source": [
    "print(f\"Difference in Optimal energy: {vqe_result.energy - (-1.8657150931815518)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c749e5e",
   "metadata": {},
   "source": [
    "## Discussion:\n",
    "\n",
    "* The `optimal energy` from class was $-1.8657150931815518$ (Ha) which gives a difference of $\\sim 0.0205$.\n",
    "* Can't tell as directly as in class but if we could figure out the nuclear repulsion energy, then we would know a `total energy` for this case as well (by the difference with the optimal one).\n",
    "* The provided `Hamiltonian` describes the molecular system defined in class quite well. I suppose we could trace back what each term means physically in the molecule itself.\n",
    "In the following you can see my assumption on that."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "782d5963",
   "metadata": {},
   "source": [
    "\\begin{aligned}\n",
    "    - \\sum_{i=1}^{2} \\frac{\\nabla_i^2}{2} &= -1.0523 \\cdot (I \\otimes I)\\\\\n",
    "    - \\frac{1}{|\\mathbf{r}_1 - \\mathbf{R}_A|} - \\frac{1}{|\\mathbf{r}_2 - \\mathbf{R}_A|} &= + 0.3979 \\cdot (I \\otimes Z)\\\\\n",
    "    - \\frac{1}{|\\mathbf{r}_1 - \\mathbf{R}_B|} - \\frac{1}{|\\mathbf{r}_2 - \\mathbf{R}_B|} &= - 0.3979 \\cdot (Z \\otimes I)\\\\\n",
    "    \\frac{1}{|\\mathbf{r}_1 - \\mathbf{r}_2|} &= - 0.0112 \\cdot (Z \\otimes Z)\\\\\n",
    "    \\frac{1}{|\\mathbf{R}_A - \\mathbf{R}_B|} &= + 0.1809 \\cdot (X \\otimes X)\\\\\n",
    "\\end{aligned}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5d20c48",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
